/******************************************************************************
* 文件名称: list.h
* 内容摘要: 链表头文件
* 创建者の: 孔佳伟
* 个人主页: https://gitee.com/thin-wind/jump
* 修改记录: 
******************************************************************************/

#ifndef __LIST_H_
#define __LIST_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <common.h>
#include <stddef.h>

typedef struct LIST_NODE
{
    struct LIST_NODE* prev;
    struct LIST_NODE* next;
} LIST_NODE;

typedef LIST_NODE     LIST;

// 遍历链表
#define LIST_FOR_EACH(list, pos)        for((pos) = (list)->next; (pos) != (list); (pos) = (pos)->next)

// 取链表节点首地址
#define LIST_NODE(ptr, type, member)    container_of(ptr, type, member)

/******************************************************************************
* 函数名称: void ListInit(LIST* list)
* 功能说明: 链表初始化
* 输入参数: LIST* list	--链表　
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListInit(LIST* list);

/******************************************************************************
* 函数名称: void ListAddHead(LIST* list, LIST_NODE* node)
* 功能说明: 在链表头插入一个节点
* 输入参数: LIST* list        --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddHead(LIST* list, LIST_NODE* node);

/******************************************************************************
* 函数名称: void ListAddTail(LIST* list, LIST_NODE* node)
* 功能说明: 在链表尾插入一个节点
* 输入参数: LIST* list        --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddTail(LIST* list, LIST_NODE* node);

/******************************************************************************
* 函数名称: void ListAddBefore(LIST_NODE* before, LIST* node)
* 功能说明: 在 before 节点前插入一个 node 节点
* 输入参数: LIST* before      --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddBefore(LIST* before, LIST* node);

/******************************************************************************
* 函数名称: void ListAddAfter(LIST_NODE* after, LIST_NODE* node)
* 功能说明: 在 after 节点后插入一个 node 节点
* 输入参数: LIST* after       --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddAfter(LIST* after, LIST_NODE* node);

/******************************************************************************
* 函数名称: void ListDelNode(LIST_NODE* node)
* 功能说明: 删除 node 节点
* 输入参数: LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListDelNode(LIST_NODE* node);

/******************************************************************************
* 函数名称: void ListReplaceNode(LIST_NODE* old, LIST_NODE* new)
* 功能说明: 把 old 节点替换成 new 节点
* 输入参数: LIST_NODE* old    --节点
    　　　　LIST_NODE* new    --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListReplaceNode(LIST_NODE* old, LIST_NODE* new);

/******************************************************************************
* 函数名称: BOOL ListIsLast(LIST* list, LIST_NODE* node)
* 功能说明: 判断 node 节点是否是链表最后的节点
* 输入参数: LIST* list        --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 0:否; 1:是
* 其它说明: 无
******************************************************************************/
BOOL ListIsLast(LIST* list, LIST_NODE* node);

/******************************************************************************
* 函数名称: BOOL ListIsEmpty(LIST* list)
* 功能说明: 判断链表是否为空
* 输入参数: LIST* list        --链表
* 输出参数: 无
* 函数返回: 0:否; 1:是
* 其它说明: 无
******************************************************************************/
BOOL ListIsEmpty(LIST* list);

#ifdef __cplusplus
}
#endif

#endif

